/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.drm.mobile1;

/**
 * This class provides interfaces to access the DRM rights.
 */
public class DrmRights {
	/**
	 * The DRM permission of play.
	 */
	public static final int DRM_PERMISSION_PLAY = 1;

	/**
	 * The DRM permission of display.
	 */
	public static final int DRM_PERMISSION_DISPLAY = 2;

	/**
	 * The DRM permission of execute.
	 */
	public static final int DRM_PERMISSION_EXECUTE = 3;

	/**
	 * The DRM permission of print.
	 */
	public static final int DRM_PERMISSION_PRINT = 4;

	/**
	 * Successful operation.
	 */
	private static final int JNI_DRM_SUCCESS = 0;

	/**
	 * General failure.
	 */
	private static final int JNI_DRM_FAILURE = -1;

	/**
	 * The uid of this rights object.
	 */
	private String roId = "";

	/**
	 * Construct the DrmRights.
	 */
	public DrmRights() {
	}

	/**
	 * Get the constraint of the given permission on this rights object.
	 * 
	 * @param permission
	 *            the given permission.
	 * 
	 * @return a DrmConstraint instance.
	 */
	public DrmConstraintInfo getConstraint(int permission) {
		DrmConstraintInfo c = new DrmConstraintInfo();

		/* call native method to get latest constraint information */
		int res = nativeGetConstraintInfo(permission, c);

		if (JNI_DRM_FAILURE == res)
			return null;

		return c;
	}

	/**
	 * Consume the rights of the given permission.
	 * 
	 * @param permission
	 *            the given permission.
	 * 
	 * @return true if consume success. false if consume failure.
	 */
	public boolean consumeRights(int permission) {
		/* call native method to consume and update rights */
		int res = nativeConsumeRights(permission);

		if (JNI_DRM_FAILURE == res)
			return false;

		return true;
	}

	/**
	 * native method: get the constraint information of the given permission.
	 * 
	 * @param permission
	 *            the given permission.
	 * @param constraint
	 *            the instance of constraint.
	 * 
	 * @return #JNI_DRM_SUCCESS if succeed. #JNI_DRM_FAILURE if fail.
	 */
	private native int nativeGetConstraintInfo(int permission, DrmConstraintInfo constraint);

	/**
	 * native method: consume the rights of the given permission.
	 * 
	 * @param permission
	 *            the given permission.
	 * 
	 * @return #JNI_DRM_SUCCESS if succeed. #JNI_DRM_FAILURE if fail.
	 */
	private native int nativeConsumeRights(int permission);

	/**
	 * Load the shared library to link the native methods.
	 */
	static {
		try {
			System.loadLibrary("drm1_jni");
		} catch (UnsatisfiedLinkError ule) {
			System.err.println("WARNING: Could not load libdrm1_jni.so");
		}
	}
}